"""
文件名: OperationData.py
作用: 读取表格中的测试数据  excel文件后缀 .xls
    将代码和数据分离
读取数据组合成什么样的格式:
    列表嵌套列表
    列表嵌套字典
读取数据使用库 pandas
    1.安装pandas库  pip install pandas
        pandas库可以读取excel表格,也可以读CSV文件
    2.使用pandas读取excel表格中的数据

pandas 读取数字时numpy.int64,
python中数字:int/float
需要将numpy.int64转为-->int

"""
import json
import os
import numpy
import pandas


class OperationData(object):
    def __init__(self, file_name):
        base_path = os.path.dirname(os.path.dirname(__file__))
        data_path = os.path.join(base_path,'data') # 测试文件存放目录路径
        file_path = os.path.join(data_path,file_name) # 测试文件路径
        self._table = pandas.read_excel(file_path, keep_default_na=False)  # 读取excel文件

    def _get_data_to_list(self):
        """
        将数据读取成为列表嵌套列表: [[],[],[],...]
        :return:
        """
        return self._table.values.tolist()
        pass

    def _get_data_to_dict(self):
        """
        将数据读取成为列表嵌套字典: [{},{},{},...]
        :return:
        """
        return [self._table.loc[i].to_dict() for i in self._table.index.values]
        pass

    def new_list(self):
        # 现将读取到的数据,转为字符串,将不符合python字符类型的数据,转为符合python的
        # 将转换后的字符串,转为list
        new_str = json.dumps(self._get_data_to_list(), cls=NpEncoder)  # 将得到的列表嵌套列表转为字符串
        return json.loads(new_str)

    def new_dict(self):
        new_str = json.dumps(self._get_data_to_dict(), cls=NpEncoder)
        return json.loads(new_str)


# 处理pandas读取CSV/excel中整数数据类型
class NpEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, numpy.integer):  # numpy.integer 是int64
            return int(obj)
        elif isinstance(obj, numpy.floating):
            return float(obj)
        elif isinstance(obj, numpy.ndarray):
            return obj.tolist()
        else:
            return super(NpEncoder, self).default(obj)


if __name__ == '__main__':
    oper = OperationData('../data/login_data.xls')
    print(oper.new_dict())
    # # 1.读整张表
    # table = pandas.read_excel('../data/login_data.xls')
    # # print(table.head())  # 默认读取表中前5行数据,不包含表头
    # # 2.将表格中的数据读取成列表嵌套列表格式
    # list_data = table.values.tolist()
    # # print(list_data)
    # # 3.将表格中的数据读取成列表嵌套字典格式
    # data_dict = []  # 定义一个空列表
    # for i in table.index.values:  # table.index.values获取表格中行号
    #     row_data = table.loc[i].to_dict()  # 将每一行的内容转为字典格式
    #     data_dict.append(row_data)  # 将每一个字典添加到列表中
    # # print(data_dict)
    # dict_data = [table.loc[i].to_dict() for i in table.index.values]
    # print(dict_data)
